package mao.genericity;
import java.util.ArrayList;
import java.util.List;

class Fruit {}
class Apple extends Fruit {}
class Jonathan extends Apple {}
class Orange extends Fruit {}

/**
 * 总结就是只能向上进行类型转化，不能向下转型。
 * ---------上届--? extends 上届 -------- //可以get,实际类型可以向上届转型。
 * 实际的类型
 * ---------下届---？ supper 下届 -------//可以添加下届以下的类，因为都可以转型为实际类型。
 *  正真需要考虑的是通过引用指向的对象。
 */
public class CovariantArrays {
    public static void main(String[] args) {

        List<Apple> apples = new ArrayList<Apple>();
        apples.add(new Apple());
        apples.add(new Apple());
        //上界,这里指的是apple extends fruit;
        List<? extends Fruit> flistTop = apples;
        flistTop.add(null);
        //flistTop.add(new Fruit) 这里不确定Fruit是否可以转换为？ 其实就是Apple。
        for (Fruit fruit : flistTop) {
            System.out.println(fruit);
        }


        //下界
        List<? super Apple> flistBottem = new ArrayList<Apple>();
        flistBottem.add(new Apple());  //?高于apple添加的时候就可以向上转换为Apple,Apple实际也就是？
        flistBottem.add(new Jonathan());
        //get Apple对象会报错，这是因为实际保存的是高于Apple的，那么取出的话存在着向下类型转换的问题。
        //Apple apple = flistBottem.get(0);
        Object object = flistBottem.get(0);

        //以下不能进行实例化
        //ArrayList<? extends Number> numbers = new ArrayList<? extends Number>();
    }
}